package com.tinfeng.uplevel;

public class JavaException {
    // Java 异常处理
    /**
     * Throwable类:
     * Throwable 位于 java.lang 包下，它是 Java 语言中所有错误（Error）和异常（Exception）的父类。
     *
     * Throwable 包含了其线程创建时线程执行堆栈的快照，它提供了 printStackTrace() 等接口用于获取堆栈跟踪数据等信息。
     *
     * 主要方法：
     *
     * fillInStackTrace： 用当前的调用栈层次填充 Throwable 对象栈层次，添加到栈层次任何先前信息中；
     *
     * getMessage：返回关于发生的异常的详细信息。这个消息在 Throwable 类的构造函数中初始化了；
     *
     * getCause：返回一个 Throwable 对象代表异常原因；
     *
     * getStackTrace：返回一个包含堆栈层次的数组。下标为 0 的元素代表栈顶，最后一个元素代表方法调用堆栈的栈底；
     *
     * printStackTrace：打印 toString() 结果和栈层次到 System.err，即错误输出流。
     */

    /**
     * Error 类
     * Error 是 Throwable 的一个直接子类，它可以指示合理的应用程序不应该尝试捕获的严重问题。
     * 这些错误在应用程序的控制和处理能力之外，编译器不会检查 Error，对于设计合理的应用程序来说，即使发生了错误，
     * 本质上也无法通过异常处理来解决其所引起的异常状况。
     *
     * 常见 Error：
     *
     * AssertionError：断言错误；
     *
     * VirtualMachineError：虚拟机错误；
     *
     * UnsupportedClassVersionError：Java 类版本错误；
     *
     * OutOfMemoryError ：内存溢出错误。
     */

    /**
     * Exception 类
     * Exception 是 Throwable 的一个直接子类。它指示合理的应用程序可能希望捕获的条件。
     *
     * Exception 又包括 Unchecked Exception（非检查异常）和 Checked Exception（检查异常）两大类别。
     *
     * Unchecked Exception （非检查异常）
     * Unchecked Exception 是编译器不要求强制处理的异常，包含 RuntimeException 以及它的相关子类。我们编写代码时即使不去处理此类异常，程序还是会编译通过。
     *
     * 常见非检查异常：
     *
     * NullPointerException：空指针异常；
     *
     * ArithmeticException：算数异常；
     *
     * ArrayIndexOutOfBoundsException：数组下标越界异常；
     *
     * ClassCastException：类型转换异常。
     *
     * Checked Exception（检查异常）
     * Checked Exception 是编译器要求必须处理的异常，除了 RuntimeException 以及它的子类，都是 Checked Exception 异常。我们在程序编写时就必须处理此类异常，否则程序无法编译通过。
     *
     * 常见检查异常：
     *
     * IOException：IO 异常
     *
     * SQLException：SQL 异常
     */

    // throw
    /**
     * public class ExceptionDemo2 {
     *     // 打印 a / b 的结果
     *     public static void divide(int a, int b) {
     *         if (b == 0) {
     *             // 抛出异常
     *             throw new ArithmeticException("除数不能为零"); 直接抛出
     *         }
     *         System.out.println(a / b);
     *     }
     *
     *     public static void main(String[] args) {
     *         // 调用 divide() 方法
     *         divide(2, 0);
     *     }
     * }
     */

    // throws 本类不处理的方法可以往出抛让下层处理，就比如汽车出了问题，汽车自己不能修，需要找修理工
}
